// ts :TypeScript 是JavaScript的超集，在JavaScript的基础上添加了类型系统。
// ts是js的超集，ts是js的扩展，ts=js+类型系统

// ts的编译器：tsc
// ts的编译器可以将ts代码编译成js代码
// ts的编译器可以将ts代码编译成js代码，然后可以在浏览器中运行
// ts的编译器可以将ts代码编译成js代码，然后可以在node.js中运行

// 大部分语法与js相同。
let num: number = 10;
let str: string = "hello";
let bool: boolean = true;
let arr: number[] = [1, 2, 3];
let arr2: Array<number> = [1, 2, 3];
let obj: object = { name: "张三1", age: 18 };
let obj2: { name: string; age: number } = { name: "张三2", age: 18 };
let obj3: { [key: string]: any } = { name: "张三3", age: 18 };
let obj4: { [key: string]: number } = { name: 18, age: 18 };

// ts中的函数
function add(a: number, b: number): number {
    return a + b;
}
// ts中的类
class Person {
    name: string;
    age: number;
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    sayHello() {
        console.log(`大家好，我叫${this.name}，我今年${this.age}岁`);
    }
}

// ts中的接口
interface Person {
    name: string;
    age: number;
    sayHello(): void;
}
// ts中的枚举
enum Color {
    Red,
    Green,
    Blue,
}
// ts中的泛型
function identity<T>(arg: T): T {
    return arg;
}
function identity2<T, U>(arg1: T, arg2: U): T {
    return arg1;
}
// ts中的类型断言
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
// ts中的类型守卫
function isNumber(value: any): value is number {
    return typeof value === "number";
}

// ts中的类型别名
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
    if (typeof n === "string") {
        return n;
    } else {
        return n();
    }
}
// ts中的类型推断
let myFavoriteNumber = "seven";

